package sg.edu.ntu.sce.sands.crypto;

import sg.edu.ntu.sce.sands.crypto.dcpabe.*;
import sg.edu.ntu.sce.sands.crypto.dcpabe.ac.AccessStructure;
import sg.edu.ntu.sce.sands.crypto.dcpabe.key.PersonalKey;

/**
 * CP-ABE 多授权实现
 */
public class MultiAuth {
    public void multiAuthorization(){
        // 一、全局初始化
        // 随机指定安全参数
        int lambda = 160;
        // 全局公共参数 gp
        GlobalParameters gp = DCPABE.globalSetup(lambda);
        // 指定用户身份标识符 uid
        String uId = "user";
        // 生成授权中心 aid
        AuthorityKeys aId = DCPABE.authoritySetup("a1", gp, "a", "b", "c", "d","e","f");

        // 二、属性授权中心初始化
        AccessStructure as = AccessStructure.buildFromPolicy("and a b c d e f");
        // 授权中心公钥PK_aid
        PublicKeys pk = new PublicKeys();
        pk.subscribeAuthority(aId.getPublicKeys());
        // 授权中心私钥SK_aid
        PersonalKeys sk = new PersonalKeys("user");

        // 三、密钥生成
        // 用户解密密钥 K_x_uid（ x 为属性集 S 的每一个属性）
        PersonalKey k_user_a = DCPABE.keyGen(uId, "a", aId.getSecretKeys().get("a"), gp);
        PersonalKey k_user_b = DCPABE.keyGen(uId, "b", aId.getSecretKeys().get("b"), gp);
        PersonalKey k_user_c = DCPABE.keyGen(uId, "c", aId.getSecretKeys().get("c"), gp);
        PersonalKey k_user_d = DCPABE.keyGen(uId, "d", aId.getSecretKeys().get("d"), gp);
        sk.addKey(k_user_a);
        sk.addKey(k_user_b);
        sk.addKey(k_user_c);
        sk.addKey(k_user_d);

        Message message = DCPABE.generateRandomMessage("Plaintext message",gp);
        // 四、数据加密
        // 密文 CT
        Ciphertext ct = DCPABE.encrypt(message, as, gp, pk);

        // 五、数据解密（全局公共参数 gp，数据密文 ct，用户解密密钥 sk）
        Message dMessage = DCPABE.decrypt(ct, sk, gp);
    }
}
